/**
 * 时间类工具
 */
var DateUtil = {
    // 默认格式 (YYYY-MM-DD hh:mm:ss:iii)
    defaultPattern: 'yyyy-MM-dd HH:mm:ss',
    /**
     * @description 判断一个值是否是日期类型
     * @param date
     * @returns {boolean}
     */
    isDate: function (date){
        return Object.prototype.toString.call(date) === '[object Date]';
    },
    /**
     * @description 将日期格式化成指定格式的字符串
     * @param date 要格式化的日期，不传时默认当前时间，也可以是一个时间戳
     * @param fmt 目标字符串格式，支持的字符有：y,M,d,q,w,H,h,m,S，默认：yyyy-MM-dd HH:mm:ss
     * @returns 返回格式化后的日期字符串
     * eg:
     * formatDate(); // 2016-09-02 13:17:13
     * formatDate(new Date(), 'yyyy-MM-dd'); // 2016-09-02
     * formatDate(new Date(), 'yyyy-MM-dd 第q季度 www HH:mm:ss:SSS'); // 2016-09-02 第3季度 星期五 13:19:15:792
     * formatDate(1472793615764); // 2016-09-02 13:20:15
     */
    formatDate: function (date, fmt) {
        date = date == undefined ? new Date() : date;
        date = typeof date == 'number' ? new Date(date) : date;
        fmt = fmt || this.defaultPattern;
        var obj = {
            'y': date.getFullYear(), // 年份，注意必须用getFullYear
            'M': date.getMonth() + 1, // 月份，注意是从0-11
            'd': date.getDate(), // 日期
            'q': Math.floor((date.getMonth() + 3) / 3), // 季度
            'w': date.getDay(), // 星期，注意是0-6
            'H': date.getHours(), // 24小时制
            'h': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小时制
            'm': date.getMinutes(), // 分钟
            's': date.getSeconds(), // 秒
            'S': date.getMilliseconds() // 毫秒
        };
        var week = ['天', '一', '二', '三', '四', '五', '六'];
        for (var i in obj) {
            fmt = fmt.replace(new RegExp(i + '+', 'g'), function (m) {
                var val = obj[i] + '';
                if (i == 'w') return (m.length > 2 ? '星期' : '周') + week[val];
                for (var j = 0, len = val.length; j < m.length - len; j++) val = '0' + val;
                return m.length == 1 ? val : val.substring(val.length - m.length);
            });
        }
        return fmt;
    },
    /**
     * @description 将字符串解析成日期
     * @param str 输入的日期字符串，如'2014-09-13'
     * @param fmt 字符串格式，默认:yyyy-MM-dd HH:mm:ss，支持如下：y、M、d、H、m、s、S，不支持w和q
     * @returns 解析后的Date类型日期
     * eg:
     * parseDate('2016-08-11','yyyy-MM-dd'); // Thu Aug 11 2016 00:00:00 GMT+0800
     * parseDate('2016-08-11 13:28:43') // Thu Aug 11 2016 13:28:43 GMT+0800
     */
    parseDate: function (str, fmt) {
        fmt = fmt || this.defaultPattern;
        var obj = {y: 0, M: 1, d: 0, H: 0, h: 0, m: 0, s: 0, S: 0};
        fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g,
            function (m, $1, $2, $3, $4, idx, old) {
            str = str.replace(new RegExp($1 + '(\\d{' + $2.length + '})' + $4),
                function (_m, _$1) {
                obj[$3] = parseInt(_$1);
                return '';
            });
            return '';
        });
        obj.M--; // 月份是从0开始的，所以要减去1
        var date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
        if (obj.S !== 0) date.setMilliseconds(obj.S); // 如果设置了毫秒
        return date;
    },
    /**
     * @description 修改日期字符串格式
     * @param str
     * @param parsingFormat
     * @param outputFormat
     * @returns {返回格式化后的日期字符串}
     */
    formatString: function (str,sourceFormat,targetFormat){
        return this.formatDate(this.parseDate(str,sourceFormat),targetFormat);
    },
    /**
     * @description 获取年份，格式：yyyy
     * @param date 时间
     * @returns {number}
     */
    formatterYear: function (date) {
        date = date == null ? new Date() : date;
        return date.getFullYear();
    },
    /**
     * @description 获取年月，格式：yyyy-MM
     * @param date 时间
     * @returns {string}
     */
    formatterMonth: function (date) {
        date = date == null ? new Date() : date;
        return this.formatDate(date,"yyyy-MM");
    },
    /**
     * @description 获取年月日，格式：yyyy-MM-dd
     * @param date 时间
     * @returns {string}
     */
    formatterDate: function (date) {
        date = date == null ? new Date() : date;
        return this.formatDate(date,"yyyy-MM-dd");
    },
    /**
     * @description 获取年月日时分秒，格式：yyyy-MM-dd HH:mm:ss
     * @param date
     * @returns {string}
     */
    formatterDateTime: function (date) {
        date = date == null ? new Date() : date;
        return this.formatDate(date,"yyyy-MM-dd HH:mm:ss");
    },
    /**
     * @description 获取时分，格式：HH:mm
     * @param date
     * @returns {string}
     */
    formatterTime: function (date) {
        return  this.formatDate(date,"HH:mm");
    },
    /**
     * @description 指定日期加上指定年份
     * @param year
     * @returns {string}
     */
    givenYear: function(time,year) {
        return new(time.getFullYear() + year,time.getMonth() + 1,time.getDate());
    },
    /**
     * @description 指定日期加上指定天数
     * @param date 日期
     * @param day 天数
     * @returns {Date}
     */
    givenDate:function(date, day){
        return new Date(date.getTime() + day * 24 * 60 * 60 * 1000);
    },
    /**
     * @description 指定日期加上指定小时
     * @param date 日期
     * @param hour 小时
     * @returns {Date}
     */
    givenHour:function(date, hour){
        return new Date(date.getTime() + hour * 60 * 60 * 1000);
    },
    /**
     * @description 指定日期加上指定分钟数
     * @param date 日期
     * @param minute 分钟
     * @returns {Date}
     */
    givenMinute:function(date, minute){
        return new Date(date.getTime() + minute * 60 * 1000);
    },
    /**
     * @description 将字符串转换成时间戳
     * @param targetDate 格式 ： yyyy-MM-dd HH:mm:ss
     * @returns {number}
     */
    strToDateTimeStamp: function(targetDate){
        // 替换成标准格式
        targetDate = targetDate.replace(/-/g,'/');
        return Math.round(new Date(targetDate)/1000);
    },
    /**
     * @description 获取数组中离比较时间最近的数据
     * @param dateArr 数组
     * @param targetDate 比较的时间
     * @param valName 字段名称
     * @param flag   true 时间戳  false 标准时间
     * @returns {number}
     */
    getRecently: function (dateArr,targetDate,valName,flag){
        var timestamp = Math.round(new Date(targetDate.replace(/-/g,'/'))/1000);
        if(this.parseDate(targetDate).getMinutes()>30  && this.parseDate(targetDate).getSeconds()>0 && !flag){
            timestamp = Math.round(this.givenMinute(new Date(targetDate.replace(/-/g,'/')),-30)/1000);
        };
        var min = 0;
        var index = 0;
        var interVal;
        dateArr.forEach(function(item, i) {
            if(flag){
                interVal = Math.abs(timestamp - item[valName]);
            }else {
                interVal = Math.abs(timestamp - this.strToDateTimeStamp(item[valName]));
            }
            if(min == 0){
                min = interVal;
            }
            if (min > interVal) {
                min = interVal;
                if(flag){
                    if(item[valName]<timestamp){
                        index = i;
                    }
                }else {
                    if(parseInt(this.strToDateTimeStamp(item[valName]))<parseInt(timestamp)){
                        index = i;
                    }
                }
            }
        });
        return index;
    },
    /**
     * @description 获取间隔时间（默认天）
     * @param startDate
     * @param endDate
     * @returns {number}
     */
    getInerval: function (startDate, endDate, type) {
        var ms = Math.abs(endDate.getTime() - startDate.getTime());
        var inerva = 1000 * 60 * 60 * 24;
        if(type == 'h'){
            inerva = 1000 * 60 * 60;
        }
        if(type == 'm'){
            inerva = 1000 * 60;
        }
        if(type == 's'){
            inerva = 1000 * 60;
        }
        return Math.floor(ms / inerva);
    },
    /**
     * @description 获取上个月的今天
     * @param date
     * @returns {Date}
     */
    getLastMonthDate: function (date) {
        var year = date.getFullYear();
        var month = date.getMonth();
        var day = date.getDate();
        var hours = date.getHours();
        var minutes = date.getMinutes();
        var seconds = date.getSeconds();
        if (month===0) {
            year -= 1;
            month = 11;
        } else {
            month-=1;
        }
        month++;
        if (month<10) {
            month = '0' + month;
        }
        if (day<10) {
            day = '0' + day;
        }
        return new Date(year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds);
    },
    /**
     * @description 获取月份日期
     * @param year
     * @param month
     * @returns {number}
     */
    findMonthDays: function (year,month){
        return new Date(year, month, 0).getDate();
    },
    /**
     * @description 取当前月份天数
     * @returns {number}
     */
    findCurrentMonthDays: function(){
        var date = new Date();
        return this.findMonthDays(date.getFullYear(),date.getMonth() + 1);
    },
    /**
     * @description 比较时间大小 (0 等于 1 小于 1 大于)
     * @param startDate
     * @param endDate
     * @returns {number}
     */
    comparisonSize: function (startDate, endDate){
        startDate = startDate.getTime();
        endDate = endDate.getTime();
        return startDate == endDate ? 0 : (startDate < endDate ? 1 : -1);
    },
    /**
     * 获取本周到周日日期
     * @param type
     * @returns {number}
     */
    getWeekDate: function (type){
        let date = new Date();
        let day = date.getDay();
        switch (type){
            case 'monday': day = day - 1;break;
            case 'tuesday': day = day - 2;break;
            case 'wednesday': day = day - 3;break;
            case 'thursday': day = day - 4;break;
            case 'friday': day = day - 4;break;
            case 'saturday': day = day - 6;break;
            case 'sunday': day = day - 7;break;
        }
        return date.setDate(date.getDate() - day);
    },
    /**
     * 获取本周到周日日期
     * @param type
     * @param fmt
     * @returns {返回格式化后的日期字符串}
     */
    getWeekDateFmt(type,fmt){
        fmt = !fmt ? this.defaultPattern : fmt;
        let date = this.getWeekDate(type);
        return this.formatDate(date,fmt);
    }

};
